const fs = require("fs");
const path = require("path");
const { Writable, Duplex, Transform } = require("stream");
// const ws = fs.createWriteStream(path.resolve(__dirname, "copy1.txt"), {
//   highWaterMark: 1, // 写入 不代表一次写几个，而是表示我的预期
// });

// ws.write("ok");
// ws.write("ok");
// ws.write("ok");

// ws.end("ok");

// 1.可写流继承了writable接口
// WriteStream extends  Writable
// 2.Writable接口中提供了write方法
// 3.write 方法会调用 writeStream._write方法

// class MyWriteStream extends Writable {
//   _write(chunk, encoding, clearBuffer) {
//     console.log(chunk); // fs.write
//     clearBuffer(); // 陆续清空队列中的缓存内容
//   }
// }
// const mws = new MyWriteStream();
// mws.write("ok");
// mws.write("ok");
// mws.write("ok");
// Writable.write -> WriteStream._write(chunk,encoding,clearBuffer)

// http的请求和想用  在客户端读取服务端的响应 可读流 ，在服务端读取客户端的时候 也是可读流

// 可读流 fs.createReadStream
// 可写流 fs.createWriteStream
// 双工流 tcp （http 看是客户端还是服务器 ）
// 转化流 zlib crypto (加密压缩)

// class MyDuplex extends Duplex{
//     _read(){ // on('data')

//     }
//     _write(){ // write

//     }
// }
// let myDuplex = new MyDuplex();
// myDuplex.on('data',function(){

// })
// myDuplex.write();
class MyTransform extends Transform {
  _transform(chunk, encoding, callback) {
    // 转化要求输入和输出有关系
    this.push(chunk.toString().toUpperCase()); // 做转化操作
    callback();
  }
}
let myTransform = new MyTransform();

// myTransform.write("okasdasd");

// myTransform.on("data", function (chunk) {
//   console.log(chunk.toString());
// });

process.stdin; // 标准输入， 可以监听进程的内容输入
process.stdout; // 向进程中输出 console.log
process.stderr; // 向进程中输出错误 console.error

// process.stdin.on("data", function (chunk) {
//   // 可独流
//   process.stderr.write(chunk); //  console.log
// });
// 可读流直接导入到可写流中
process.stdin.pipe(myTransform).pipe(process.stderr);

// on('data') on('end')   write()  end()
